package com.yqh;

import java.io.*;
import java.util.*;

/**
 * 字节流和字符流的使用场景及案例
 *
 * @author 阳秋豪
 * @createTime 2024/3/7
 */
public class Test5 {
    public static void main(String[] args) throws IOException {
        /*-------------------- 使用场景 --------------------*/
        // 1、字节流
        // -- 拷贝任意类型的文件
        // 2、字符流
        // -- 读取纯文本文件中的数据
        // -- 往纯文本文件中写出数据

        /*-------------------- 案例1 拷贝 --------------------*/
        // 需求：
        // -- 拷贝一个文件夹，考虑子文件夹

        // 1、创建对象表示数据源
        File src = new File("被拷贝的目录");
        // 2、创建对象表示目的地
        File dest = new File("拷贝后的目录");
        // 3、调用拷贝方法
        copydir(src, dest);

        /*------------------ 案例2 文件加密 ------------------*/
        // 需求：
        // -- 为了保证文件的安全性，就需要对原始文件进行加密存储，再使用的时候再对其进行解密处理
        // -- 加密原理：对原始文件中的每一个字节数据进行更改，然后将更改以后的数据存储到新的文件中
        // -- 解密原理：读取加密之后的文件，按照加密的规则反向操作，变成原始文件

        // 1、创建对象关联文件
        FileInputStream fis = new FileInputStream("加密源文件.png");
        FileOutputStream fos = new FileOutputStream("加密目标文件.png");
        int b;
        while ((b = fis.read()) != -1) {
            fos.write(b ^ 12); // 采用异或加密，解密就是在异或相同的数一次
        }
        fos.close();
        fis.close();

        /*--------------- 案例3 修改文件中的数据 ---------------*/
        // 需求：
        // -- 文本文件中有以下的数据 2-1-9-4-7-8
        // -- 将文件中的数据进行排序，变成以下的数据 1-2-4-7-8-9

        // 1、读取数据
        FileReader fileReader = new FileReader("e.txt");
        StringBuilder stringBuilder = new StringBuilder();
        int ch;
        while ((ch = fileReader.read()) != -1) {
            stringBuilder.append((char) ch);
        }
        fileReader.close();
        // 2、排序
        String str = stringBuilder.toString();
        String[] arrStr = str.split("-");
        ArrayList<Integer> list = new ArrayList<>();
        for (String s : arrStr) {
            int i = Integer.parseInt(s);
            list.add(i);
        }
        Collections.sort(list);
        // 3、写出数据
        FileWriter fileWriter = new FileWriter("排序.txt");
        for (int i = 0; i < list.size(); i++) {
            if (i == list.size() - 1) {
                fileWriter.write(list.get(i).toString());
            } else {
                fileWriter.write(list.get(i).toString()+ "-");
            }
        }
        fileWriter.close();
    }

    /**
     * 拷贝文件
     *
     * @param src  源文件
     * @param dest 目标目录
     */
    private static void copydir(File src, File dest) throws IOException {
        dest.mkdirs();
        // 1、进入数据源
        File[] files = src.listFiles();
        // 2、遍历数组
        for (File file : files) {
            if (file.isFile()) {
                // 3、判断文件，拷贝 文件开始 文件结束
                FileInputStream fis = new FileInputStream(file);
                FileOutputStream fos = new FileOutputStream(new File(dest, file.getName()));
                byte[] bytes = new byte[1024];
                int len;
                while ((len = fis.read(bytes)) != -1) {
                    fos.write(bytes, 0, len);
                }
                fos.close();
                fis.close();
            } else {
                // 4、判断文件夹，递归
                copydir(file, new File(dest, file.getName()));
            }
        }
    }
}
